//package cn.lili.modules.search.serviceimpl;
//
//import cn.lili.modules.search.entity.dos.EsGoodsIndex;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.lucene.analysis.Analyzer;
//import org.apache.lucene.document.*;
//import org.apache.lucene.index.IndexWriter;
//import org.apache.lucene.index.IndexWriterConfig;
//import org.apache.lucene.search.SearcherFactory;
//import org.apache.lucene.search.SearcherManager;
//import org.apache.lucene.store.*;
//import org.springframework.stereotype.Component;
//import org.wltea.analyzer.lucene.IKAnalyzer;
//
//import javax.annotation.PostConstruct;
//import javax.annotation.PreDestroy;
//import java.io.IOException;
//import java.nio.file.Files;
//import java.nio.file.Path;
//import java.nio.file.Paths;
//
///**
// * @Author Sylow
// * @Description
// * @Date: Created in 16:51 2025/6/20
// */
//@Slf4j
//@Component
//public class LuceneIndexManager {
//    private static final String INDEX_PATH = "lucene_index/goods";
//    private Directory directory;
//    private Analyzer analyzer;
//    private IndexWriter writer;
//    private SearcherManager searcherManager;
//
//    @PostConstruct
//    public void init() throws IOException, InterruptedException {
//        // 创建索引目录
//        Path path = Paths.get(INDEX_PATH);
//        Files.createDirectories(path);
//
//        LockFactory lockFactory = NativeFSLockFactory.INSTANCE;
//        directory = FSDirectory.open(path, lockFactory);
//
//        if (!Files.exists(path)) {
//            Files.createDirectories(path);
//        }
//
//        clearStaleLocks(path);
//
//        // 使用中文分词器
//        analyzer = new IKAnalyzer(true);
//
//        // 创建索引写入器
//        IndexWriterConfig config = new IndexWriterConfig(analyzer);
//        config.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
//
//        // 5. 减少锁冲突概率
//        config.setMaxFullFlushMergeWaitMillis(5000); // 减少等待时间
//        config.setUseCompoundFile(false); // 使用非复合文件格式
//
//        // 6. 尝试创建写入器（带重试机制）
//        int retries = 3;
//        for (int i = 0; i < retries; i++) {
//            try {
//                writer = new IndexWriter(directory, config);
//                break;
//            } catch (LockObtainFailedException e) {
//                if (i == retries - 1) throw e;
//                Thread.sleep(1000); // 等待后重试
//                clearStaleLocks(path); // 再次清除锁
//            }
//        }
//
//        // 创建搜索管理器
//        searcherManager = new SearcherManager(writer, new SearcherFactory());
//    }
//
//    public Path getPath(){
//        return Paths.get(INDEX_PATH);
//    }
//    public Directory getDirectory() {
//        return directory;
//    }
//
//    public IndexWriter getWriter() {
//        return writer;
//    }
//
//    public SearcherManager getSearcherManager() {
//        return searcherManager;
//    }
//
//    public void refresh() throws IOException {
//        if (writer != null) {
//            writer.commit();
//        }
//        if (searcherManager != null) {
//            searcherManager.maybeRefreshBlocking();
//        }
//    }
//
//    @PreDestroy
//    public void close() throws IOException {
//        try {
//            if (searcherManager != null) {
//                searcherManager.close();
//            }
//            if (writer != null && writer.isOpen()) {
//                writer.commit(); // 确保提交所有更改
//                writer.close(); // 正确关闭写入器
//            }
//            if (directory != null) {
//                directory.close();
//            }
//        } catch (IOException e) {
//            log.error("关闭Lucene资源失败", e);
//        } finally {
//            writer = null;
//            directory = null;
//        }
//    }
//
//    // 商品索引文档转换
//    public Document convertToDocument(EsGoodsIndex goods) {
//        Document doc = new Document();
//        doc.add(new StringField("id", goods.getId(), Field.Store.YES));
//        doc.add(new StringField("goodsId", goods.getGoodsId(), Field.Store.YES));
//        doc.add(new TextField("goodsName", goods.getGoodsName(), Field.Store.YES));
//        doc.add(new StringField("categoryPath", goods.getCategoryPath(), Field.Store.YES));
//        doc.add(new DoublePoint("price", goods.getPrice()));
//        doc.add(new LongPoint("releaseTime", goods.getReleaseTime()));
//        doc.add(new StoredField("releaseTime", goods.getReleaseTime()));
//
//        // 添加促销信息
//        if (goods.getPromotionMapJson() != null) {
//            doc.add(new TextField("promotions", goods.getPromotionMapJson(), Field.Store.YES));
//        }
//
//        return doc;
//    }
//
//    public EsGoodsIndex convertToGoods(Document doc) {
//        EsGoodsIndex goods = new EsGoodsIndex();
//        goods.setId(doc.get("id"));
//        goods.setGoodsName(doc.get("goodsName"));
//        goods.setCategoryPath(doc.get("categoryPath"));
//        goods.setPrice(Double.parseDouble(doc.get("price")));
//        goods.setReleaseTime(Long.parseLong(doc.get("releaseTime")));
//
//        // 解析促销信息
//
//        goods.setPromotionMapJson(doc.get("promotions"));
//
//        return goods;
//    }
//
//    // 清除旧的锁文件
//    private void clearStaleLocks(Path indexPath) throws IOException {
//        // 删除所有可能的锁文件
//        deleteIfExists(indexPath.resolve("write.lock"));
//        deleteIfExists(indexPath.resolve("lucene-*.lock"));
//        deleteIfExists(indexPath.resolve("*.lock"));
//    }
//
//    private void deleteIfExists(Path path) {
//        try {
//            if (Files.exists(path)) {
//                Files.delete(path);
//                log.warn("Deleted stale lock file: {}", path);
//            }
//        } catch (IOException e) {
//            log.error("Failed to delete lock file: {}", path, e);
//        }
//    }
//
//}
